# -*- coding: utf-8 -*-
import requests
import json
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
from pydantic import BaseModel
import uvicorn

# 请勿改动：Ollama API地址
OLLAMA_API_URL = 'http://39.100.74.82:11434/api/chat'

# 请勿改动：系统提示内容
# SYSTEM_PROMPT = (
#     "你是一个分析助手，任务是理解用户输入并生成结构化JSON输出。提取输入中的所有核心关键词，包括名词、时间、地点、主题、动作及复合词，确保语义完整并覆盖隐含概念（如行业发展、市场规模、技术进步等）。对于复杂或多句输入，分解并提取所有关键信息。总结用户查询的核心意图，明确其想要了解或分析的内容。将查询重构为简洁、结构化的分析表达，剔除请求语气（如'请'、'描述'、'如何'、'为什么'），聚焦分析目标。返回结果必须严格符合指定的JSON schema，无多余文本或格式错误。"
# )

SYSTEM_PROMPT = ("你是一个分析助手，任务是理解用户输入并生成简洁、结构化的JSON输出。"
                "1. 理解核心主题：提取用户问题的核心关键词（名词、时间、地点、主题、动作等），包括隐含概念（如趋势、市场、技术等）。识别问题类型（趋势分析、预测、现状等）、背景和时间范围，总结核心意图（50字以内）。"
                "2. 生成相关问题：基于核心主题，生成5-8个相关且同类的问题，保持意图、类型和范围一致。问题需简洁、清晰、探索性强，避免偏离主题。"
                "3. 输出格式：返回JSON格式，包含核心意图和相关问题列表。相关问题句尾不带标点符号，每个问题以逗号分隔，中文输出。"
                "返回结果必须严格符合指定的JSON schema，无多余文本或格式错误。")

# 请勿改动：请求格式模板
REQUEST_TEMPLATE = {
    "model": "qwen3:8b",
    "messages": [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": None}  # 待填充
    ],
    "format": {
        "type": "object",
        "properties": {
            "key_concepts": {
                "type": "array",
                "items": {"type": "string"},
                "description": "理解核心主题：提取用户问题的核心关键词（名词、时间、地点、主题、动作等），包括隐含概念（如趋势、市场、技术等）。识别问题类型（趋势分析、预测、现状等）、背景和时间范围，总结核心意图（50字以内）。"
                
            },
            "query_intent": {
                "type": "string",
                "description": "简洁总结用户查询的核心意图，明确用户想要了解或分析的内容"
            },
            "query_reformulation": {
                "type": "string",
                "description": "基于核心主题，生成5-8个相关且同类的问题，保持意图、类型和范围一致。问题需简洁、清晰、探索性强，避免偏离主题。"
            }
        },
        "required": ["key_concepts", "query_intent", "query_reformulation"]
    },
    "options": {"temperature": 0},
    "stream": False
}

def fetch_structured_output(user_search_input):
    """
    根据用户输入，调用Ollama API，返回结构化JSON结果。
    :param user_search_input: str 用户查询内容
    :return: dict 响应JSON或错误信息
    """
    payload = REQUEST_TEMPLATE.copy()
    payload["messages"] = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": user_search_input}
    ]
    try:
        resp = requests.post(OLLAMA_API_URL, json=payload, timeout=30)
        resp.raise_for_status()
        print("Ollama API response:", resp.text)
        print("Ollama API返回内容：", resp.text)
        try:
            data = resp.json()
            # 新增：解析 message.content
            if "message" in data and "content" in data["message"]:
                content_str = data["message"]["content"]
                # 去除可能的换行符
                content_str = content_str.strip()
                # 解析为 dict
                content_json = json.loads(content_str)
                return content_json
            else:
                return {"error": "Ollama API响应缺少message.content字段"}
        except json.JSONDecodeError:
            return {"error": "JSON解析失败: 响应内容非JSON格式"}
    except requests.exceptions.RequestException as e:
        return {"error": f"请求失败: {str(e)}"}

# FastAPI部分
app = FastAPI()

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 生产环境建议写你的前端地址
    allow_credentials=True,
    allow_methods=["*"],  # 允许所有方法，包括OPTIONS
    allow_headers=["*"],
)
class QueryRequest(BaseModel):
    user_search_input: str

@app.post("/analyze")
async def analyze_query(req: QueryRequest):
    """分析用户查询，返回结构化内容"""
    result = fetch_structured_output(req.user_search_input)
    if "error" in result:
        # 失败返回HTTP 500和原因
        raise HTTPException(status_code=500, detail=result["error"])
    # 字段映射与格式调整
    mapped = {
        "problemAnalysis": {
            "keyConcepts": result.get("key_concepts", []),
            "queryIntent": result.get("query_intent", ""),
            "reformulatedQuery": result.get("query_reformulation", "")
        }
    }
    return JSONResponse(content=mapped)

# 可选：命令行启动FastAPI
if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8880, reload=True) 